<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>Nginx基础知识 | 无人深空</title><meta name="keywords" content="Nginx"><meta name="author" content="zcm"><meta name="copyright" content="zcm"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="Nginx基础篇1.Nginx 简介 Nginx 概述  Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器 特点是占有内存少，并发能力强 事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好，中国大陆使用 nginx 网站用户有：百度、京东、新浪、网易、腾讯、淘宝等   Nginx 作为 web 服务器  Nginx 可以作为静态页面的 web 服务器，同时">
<meta property="og:type" content="article">
<meta property="og:title" content="Nginx基础知识">
<meta property="og:url" content="https://gitee.com/zcmmmm/zcmmmm/2022/10/15/Nginx%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/index.html">
<meta property="og:site_name" content="无人深空">
<meta property="og:description" content="Nginx基础篇1.Nginx 简介 Nginx 概述  Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器 特点是占有内存少，并发能力强 事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好，中国大陆使用 nginx 网站用户有：百度、京东、新浪、网易、腾讯、淘宝等   Nginx 作为 web 服务器  Nginx 可以作为静态页面的 web 服务器，同时">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png">
<meta property="article:published_time" content="2022-10-15T01:47:38.000Z">
<meta property="article:modified_time" content="2022-10-31T11:58:24.212Z">
<meta property="article:author" content="zcm">
<meta property="article:tag" content="Nginx">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://gitee.com/zcmmmm/zcmmmm/2022/10/15/Nginx%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/',
  algolia: undefined,
  localSearch: {"path":"/search.xml","preload":false,"languages":{"hits_empty":"找不到您查询的内容：${query}"}},
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":200},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'fancybox',
  Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#49b1f5","bgDark":"#1f1f1f","position":"bottom-left"},
  source: {
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isAnchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: 'Nginx基础知识',
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isToc: true,
  postUpdate: '2022-10-31 19:58:24'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    
    const detectApple = () => {
      if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
        document.documentElement.classList.add('apple')
      }
    }
    detectApple()
    })(window)</script><link rel="stylesheet" href="/css/categories.css?v1"><link rel="stylesheet" href="/css/navigation.css?v1"><link rel="stylesheet" href="/css/custom.css?v1"><meta name="generator" content="Hexo 6.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://s2.loli.net/2022/09/22/36LN4kcjYOd9HT8.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">43</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">25</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">11</div></a></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">无人深空</a></span><div id="menus"></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div></div><div id="nav-right"><div id="search-button"><a class="site-page social-icon search"><i class="fas fa-search fa-fw"></i></a></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav></header><main class="layout" id="content-inner"><div id="post"><div id="post-info"><h1 class="post-title">Nginx基础知识</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2022-10-15T01:47:38.000Z" title="发表于 2022-10-15 09:47:38">2022-10-15</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2022-10-31T11:58:24.212Z" title="更新于 2022-10-31 19:58:24">2022-10-31</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/Others/">Others</a></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">字数总计:</span><span class="word-count">3.8k</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>12分钟</span></span><span class="post-meta-separator">|</span><span class="post-meta-pv-cv" id="" data-flag-title="Nginx基础知识"><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">阅读量:</span><span id="busuanzi_value_page_pv"><i class="fa-solid fa-spinner fa-spin"></i></span></span></div></div></div><article class="post-content" id="article-container"><h2 id="Nginx基础篇"><a href="#Nginx基础篇" class="headerlink" title="Nginx基础篇"></a><a target="_blank" rel="noopener" href="https://www.bilibili.com/video/BV1yS4y1N76R">Nginx基础篇</a></h2><h3 id="1-Nginx-简介"><a href="#1-Nginx-简介" class="headerlink" title="1.Nginx 简介"></a>1.Nginx 简介</h3><ol>
<li><p>Nginx 概述</p>
<blockquote>
<p><strong>Nginx (<code>engine x</code>) 是一个高性能的 HTTP 和反向代理服务器</strong></p>
<p><strong>特点是占有内存少，并发能力强</strong></p>
<p>事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好，中国大陆使用 nginx 网站用户有：百度、京东、新浪、网易、腾讯、淘宝等</p>
</blockquote>
</li>
<li><p>Nginx 作为 web 服务器</p>
<blockquote>
<p>Nginx 可以作为静态页面的 web 服务器，同时还支持 CGI 协议的动态语言，比如 perl、php 等。但是不支持 java</p>
<p>Java 程序只能通过与 tomcat 配合完成</p>
<p><strong>Nginx 专为性能优化而开发， 性能是其最重要的考量，实现上非常注重效率 ，能经受高负载的考验</strong></p>
<p>有报告表明能支持高达 50,000 个并发连接数</p>
</blockquote>
</li>
<li><p>正向代理</p>
<blockquote>
<p>Nginx 不仅可以做反向代理，实现负载均衡，还能用作正向代理来进行上网等功能</p>
<p>正向代理：如果把局域网外的 Internet 想象成一个巨大的资源库，则局域网中的客户端要访问 Internet，则需要通过代理服务器来访问，这种代理服务就称为正向代理</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86.png" alt="正向代理"></p>
</li>
<li><p>反向代理</p>
<blockquote>
<p>反向代理，其实客户端对代理是无感知的，因为客户端不需要任何配置就可以访问</p>
<p>只需要将请求发送到反向代理服务器，由反向代理服务器去选择目标服务器获取数据后，再返回给客户端</p>
<p>此时反向代理服务器和目标服务器对外就是一个服务器，暴露的是代理服务器地址，隐藏了真实服务器 IP 地址</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png" alt="反向代理"></p>
</li>
<li><p>负载均衡</p>
<blockquote>
<p>客户端发送多个请求到服务器，服务器处理请求，有一些可能要与数据库进行交互，服务器处理完毕后，再将结果返回给客户端</p>
<p>这种架构模式对于早期的系统相对单一，并发请求相对较少的情况下是比较适合的，成本也低</p>
<p>但是随着信息数量的不断增长，访问量和数据量的飞速增长，以及系统业务的复杂度增加，这种架构会造成服务器相应客户端的请求日益缓慢，并发量特别大的时候，还容易造成服务器直接崩溃</p>
</blockquote>
<blockquote>
<p>很明显这是由于服务器性能的瓶颈造成的问题，那么如何解决这种情况呢？</p>
<p>我们首先想到的可能是升级服务器的配置，比如提高 CPU 执行频率，加大内存等提高机器的物理性能来解决此问题，但是摩尔定律日益失效，硬件的性能提升已经不能满足日益提升的需求了</p>
<p>最明显的一个例子，天猫双十一当天，某个热销商品的瞬时访问量是极其庞大的，那么类似上面的系统架构，将机器都增加到现有的顶级物理配置，都是不能够满足需求的。那么怎么办呢？ </p>
<p>上面的分析去掉了增加服务器物理配置来解决问题的办法，也就是说纵向解决问题的办法行不通了，那么横向增加服务器的数量呢？</p>
<p>这时候集群的概念产生了，增加服务器的数量，然后将请求分发到各个服务器上，将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上，将负载分发到不同的服务器，也就是负载均衡</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.png" alt="负载均衡"></p>
</li>
<li><p>动静分离</p>
<blockquote>
<p>为了加快网站的解析速度，可以把动态页面和静态页面由不同的服务器来解析</p>
<p>加快解析速度，降低原来单个服务器的压力</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E5%8A%A8%E9%9D%99%E5%88%86%E7%A6%BB.png" alt="动静分离"></p>
</li>
</ol>
<h3 id="2-Nginx-安装"><a href="#2-Nginx-安装" class="headerlink" title="2.Nginx 安装"></a>2.Nginx 安装</h3><ol>
<li><p><a target="_blank" rel="noopener" href="http://nginx.org/">官网</a></p>
</li>
<li><p>下载 nginx 对应版本压缩包，此处使用 <code>nginx-1.12.2.tar.gz</code></p>
</li>
<li><p>解压 nginx 压缩包到 <code>/opt/module</code></p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">tar -zxvf nginx-1.12.2.tar.gz -C /opt/module</span><br></pre></td></tr></table></figure>
</li>
<li><p>进入 nginx 解压缩目录，执行<code>./configure</code></p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cd /opt/module/nginx-1.12.2</span><br><span class="line">./configure</span><br></pre></td></tr></table></figure>
</li>
<li><p>根据执行 <code>./configure</code> 之后的报错安装缺失依赖</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装 gcc</span></span><br><span class="line">yum install -y gcc</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装 perl 库</span></span><br><span class="line">yum install -y pcre pcre-devel</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装 zlib 库</span></span><br><span class="line">yum install -y zlib zlib-devel</span><br></pre></td></tr></table></figure>
</li>
<li><p>安装完成后重新执行 <code>./configure</code></p>
</li>
<li><p><code>./configure</code> 完成后依次执行以下命令</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">make</span><br><span class="line">make install</span><br></pre></td></tr></table></figure>
</li>
<li><p>默认安装位置 <code>/usr/local/nginx</code></p>
</li>
<li><p>安装成系统服务</p>
<ul>
<li><p>创建服务脚本 <code>nginx.service</code></p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">vi /usr/lib/systemd/system/nginx.service</span><br></pre></td></tr></table></figure>

<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=nginx - web server</span><br><span class="line">After=network.target remote-fs.target nss-lookup.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=forking</span><br><span class="line">PIDFile=/usr/local/nginx/logs/nginx.pid</span><br><span class="line">ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf</span><br><span class="line">ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf</span><br><span class="line">ExecReload=/usr/local/nginx/sbin/nginx -s reload</span><br><span class="line">ExecStop=/usr/local/nginx/sbin/nginx -s stop</span><br><span class="line">ExecQuit=/usr/local/nginx/sbin/nginx -s quit</span><br><span class="line">PrivateTmp=true</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure>
</li>
<li><p>重新加载系统服务</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">systemctl daemon-reload</span><br></pre></td></tr></table></figure>
</li>
<li><p>启动服务</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">systemctl start nginx.service</span><br></pre></td></tr></table></figure>
</li>
<li><p>设置开机启动</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">systemctl enable nginx.service</span><br></pre></td></tr></table></figure></li>
</ul>
</li>
</ol>
<h3 id="3-Nginx-常用的命令和配置文件"><a href="#3-Nginx-常用的命令和配置文件" class="headerlink" title="3.Nginx 常用的命令和配置文件"></a>3.Nginx 常用的命令和配置文件</h3><ol>
<li><p>常用命令</p>
<blockquote>
<p>在 <code>/usr/local/nginx/sbin</code> 目录下</p>
</blockquote>
<ul>
<li><code>./nginx</code>：启动 nginx</li>
<li><code>./nginx -s stop</code>：快速关闭 nginx</li>
<li><code>./nginx -s quit</code>：优雅关闭 nginx（在退出前完成已经接受的连接请求）</li>
<li><code>./nginx -s reload</code>：重新加载配置</li>
</ul>
</li>
<li><p>配置文件</p>
<blockquote>
<p>nginx 安装目录下，其默认的配置文件都放在这个目录的 conf 目录下，而主配置文件 nginx.conf 也在其中，后续对 nginx 的使用基本上都是对此配置文件进行相应的修改</p>
<p>可以将 nginx.cong 配置文件分为三个部分</p>
</blockquote>
<ul>
<li><p>全局块</p>
<blockquote>
<p>从配置文件开始到 events 块之间的内容，主要会设置一些影响 nginx 服务器整体运行的配置指令，主要包括配置运行 Nginx 服务器的用户（组）、允许生成的 worker process 数，进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">worker_processes 1;</span><br></pre></td></tr></table></figure>

<blockquote>
<p>这是 Nginx 服务器并发处理服务的关键配置，worker_processes 值越大，可以支持的并发处理量也越多，但是会受到硬件、软件等设备的制约</p>
</blockquote>
</li>
<li><p>events 块</p>
<blockquote>
<p>events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接</p>
<p>常用的设置包括是否开启对多 work process 下的网络连接进行序列化，是否允许同时接收多个网络连接，选取哪种事件驱动模型来处理连接请求，每个 word process 可以同时支持的最大连接数等</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">events &#123;</span><br><span class="line">	worker_connections 1024;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<blockquote>
<p>上述例子就表示每个 work process 支持的最大连接数为 1024</p>
<p>这部分的配置对 Nginx 的性能影响较大，在实际中应该灵活配置</p>
</blockquote>
</li>
<li><p>http 块</p>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/http%E5%9D%97.png" alt="http块"></p>
<blockquote>
<p>这是 Nginx 服务器配置中最频繁的部分</p>
<p>代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里</p>
<p>需要注意的是：http 块也可以包括 http 全局块、server 块</p>
</blockquote>
<ul>
<li><p>http 全局块</p>
<blockquote>
<p>http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等</p>
</blockquote>
</li>
<li><p>server 块</p>
<blockquote>
<p>这块和虚拟主机有密切关系，虚拟主机从用户角度看，和一台独立的硬件主机是完全一样的，该技术的产生是为了 节省互联网服务器硬件成本</p>
<p>每个 http 块可以包括多个 server 块，而每个 server 块就相当于一个虚拟主机</p>
<p>而每个 server 块也分为全局 server 块，以及可以同时包含多个 locaton 块</p>
</blockquote>
<ul>
<li><p>全局 server 块</p>
<blockquote>
<p>最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置</p>
</blockquote>
</li>
<li><p>location 块</p>
<blockquote>
<p>一个 server 块可以配置多个 location 块</p>
<p>这块的主要作用是基于 Nginx 服务器接收到的请求字符串（例如 server_name&#x2F;uri-string），对虚拟主机名称 （也可以是 IP 别名）之外的字符串（例如 前面的 &#x2F;uri-string）进行匹配，对特定的请求进行处理</p>
<p>地址定向、数据缓 存和应答控制等功能，还有许多第三方模块的配置也在这里进行</p>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Nginx 工作流程</p>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/nginx%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B.png" alt="nginx工作流程"></p>
</li>
</ol>
<h3 id="4-Nginx-配置实例-反向代理"><a href="#4-Nginx-配置实例-反向代理" class="headerlink" title="4.Nginx 配置实例-反向代理"></a>4.Nginx 配置实例-反向代理</h3><ol>
<li><p>反向代理概念</p>
<blockquote>
<p>反向代理：由服务器端向客户端提供的代理</p>
<p>反向代理方式是指以代理服务器来接受 Internet 上的连接请求，然后将请求转发给内部网络上的服务器</p>
<p>并将从服务器上得到的结果返回给 Internet 上请求连接的客户端，此时代理服务器对外就表现为一个服务器</p>
</blockquote>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%A4%BA%E6%84%8F.png" alt="反向代理示意"></p>
</li>
<li><p>反向代理在系统架构中的应用场景</p>
<ul>
<li><p>作为内容服务器的替身</p>
<blockquote>
<p>如果您的内容服务器具有必须保持安全的敏感信息，如信用卡号数据库，可在防火墙外部设置一个代理服务器作为内容服务器的替身</p>
<p>当外部客户机尝试访问内容服务器时，会将其送到代理服务器。实际内容位于内容服务器上，在防火墙内部受到安全保护。代理服务器位于防火墙外部，在客户机看来就像是内容服务器</p>
</blockquote>
</li>
<li><p>作为内容服务器的负载均衡器</p>
<blockquote>
<p>可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载</p>
<p>在此模型中，可以利用代理服务器的高速缓存特性，创建一个用于负载平衡的服务器池</p>
<p>此时，代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会接收大量的请求，则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率</p>
</blockquote>
</li>
</ul>
</li>
<li><p>反向代理实例</p>
<ul>
<li><p>实例1</p>
<blockquote>
<p>要求：使用 nginx 反向代理，访问 <code>www.123.com</code> 直接跳转到 <code>127.0.0.1:8080</code></p>
</blockquote>
<ul>
<li><p>修改配置文件 <code>nginx.conf</code></p>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">server <span class="punctuation">&#123;</span></span><br><span class="line">	listen	<span class="number">80</span>;</span><br><span class="line">	server_name	www<span class="number">.123</span>.com;</span><br><span class="line">	</span><br><span class="line">	location / <span class="punctuation">&#123;</span></span><br><span class="line">		proxy_pass http<span class="punctuation">:</span><span class="comment">//127.0.0.1:8080;</span></span><br><span class="line">		index 	index.html index.htm index.jsp;</span><br><span class="line">	<span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>如上配置，监听 80 端口，访问域名为 <code>www.123.com</code>，不加端口号时默认为 80 端口，故访问该域名时会跳转到 <code>127.0.0.1:8080</code> 路径上</p>
</li>
</ul>
</li>
<li><p>实例2</p>
<blockquote>
<p>要求：使用 nginx 反向代理，根据访问的路径跳转到不同端口的服务中 </p>
<p>nginx 监听端口为 9001</p>
<p>访问 <code>http://127.0.0.1:9001/edu/</code> 直接跳转到 <code>127.0.0.1:8081</code></p>
<p>访问 <code>http://127.0.0.1:9001/vod/ </code>直接跳转到 <code>127.0.0.1:8082</code></p>
</blockquote>
<ul>
<li><p>准备两个 tomcat，一个 8001 端口，一个 8002 端口，并准备好测试的页面</p>
</li>
<li><p>修改配置文件 <code>nginx.conf</code></p>
<blockquote>
<p>在 http 块中添加 server {}</p>
</blockquote>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">server <span class="punctuation">&#123;</span></span><br><span class="line">    listen <span class="number">9001</span>;</span><br><span class="line">    server_name localhost;</span><br><span class="line">    </span><br><span class="line">    location ~ /edu/ <span class="punctuation">&#123;</span></span><br><span class="line">    	proxy_pass http<span class="punctuation">:</span><span class="comment">//localhost:8001;</span></span><br><span class="line">	<span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">	location ~ /vod/ <span class="punctuation">&#123;</span></span><br><span class="line">    	proxy_pass http<span class="punctuation">:</span><span class="comment">//localhost:8001;</span></span><br><span class="line">	<span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li>
</ul>
</li>
</ul>
</li>
<li><p>location 指令说明</p>
<p> <img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/location.png" alt="location"></p>
<ul>
<li><code>=</code>：用于不含正则表达式的 uri 前，要求请求字符串与 uri 严格匹配，如果匹配成功，就停止继续向下搜索并立即处理该请求</li>
<li><code>~</code>：用于表示 uri 包含正则表达式，并且区分大小写</li>
<li><code>~*</code>：用于表示 uri 包含正则表达式，并且不区分大小写</li>
<li><code>^~</code>：用于不含正则表达式的 uri 前，要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后，立即使用此 location 处理请求，而不再使用 location 块中的正则 uri 和请求字符串做匹配</li>
<li>注意：如果 uri 包含正则表达式，则必须要有 <code>~</code> 或者 <code>~*</code> 标识</li>
</ul>
</li>
</ol>
<h3 id="5-Nginx-配置实例-负载均衡"><a href="#5-Nginx-配置实例-负载均衡" class="headerlink" title="5.Nginx 配置实例-负载均衡"></a>5.Nginx 配置实例-负载均衡</h3><blockquote>
<p>随着互联网信息的爆炸性增长，负载均衡（load balance）已经不再是一个很陌生的话题， 顾名思义，负载均衡即是将负载分摊到不同的服务单元，既保证服务的可用性，又保证响应足够快</p>
<p>快速增长的访问量和数据流量催生了各式各样的负载均衡产品， 很多专业的负载均衡硬件提供了很好的功能，但却价格不菲，这使得负载均衡软件大受欢迎， nginx 就是其中的一个，在 linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务，而且 Nginx 提供了几种分配策略</p>
</blockquote>
<ul>
<li><p>轮询策略（默认）</p>
<blockquote>
<p>每个请求按时间顺序逐一分配到不同的后端服务器，如果后端服务器 down 掉，能自动剔除</p>
</blockquote>
</li>
<li><p>weight 指定权重（常用）</p>
<blockquote>
<p>weight 代表权，默认为 1</p>
<p><strong>权重越高被分配的客户端越多指定轮询几率，weight 和访问比率成正比，用于后端服务器性能不均的情况</strong></p>
</blockquote>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">upstream server_pool <span class="punctuation">&#123;</span></span><br><span class="line">    server <span class="number">192.168</span><span class="number">.10</span><span class="number">.120</span> weight=<span class="number">10</span>;</span><br><span class="line">    server <span class="number">192.168</span><span class="number">.10</span><span class="number">.121</span> weight=<span class="number">10</span>;</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>ip_hash（不常用）</p>
<blockquote>
<p>每个请求按访问 ip 的 hash 结果分配，这样每个访客固定访问一个后端服务器，可以解决 session 的问题（保持会话）</p>
</blockquote>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">upstream server_pool <span class="punctuation">&#123;</span></span><br><span class="line">    ip_hash;</span><br><span class="line">    server <span class="number">192.168</span><span class="number">.10</span><span class="number">.120</span><span class="punctuation">:</span><span class="number">80</span>;</span><br><span class="line">    server <span class="number">192.168</span><span class="number">.10</span><span class="number">.121</span><span class="punctuation">:</span><span class="number">80</span>;</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>fair（不常用）</p>
<blockquote>
<p>按后端服务器的响应时间来分配请求，响应时间短的优先分配</p>
</blockquote>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">upstream server_pool <span class="punctuation">&#123;</span></span><br><span class="line">    server <span class="number">192.168</span><span class="number">.10</span><span class="number">.120</span><span class="punctuation">:</span><span class="number">80</span>;</span><br><span class="line">    server <span class="number">192.168</span><span class="number">.10</span><span class="number">.121</span><span class="punctuation">:</span><span class="number">80</span>;</span><br><span class="line">    fair;</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>url_hash（不常用）：根据用户访问的 url 定向转发请求</p>
</li>
<li><p>least_conn（不常用）：最少链接访问</p>
</li>
</ul>
<h3 id="6-Nginx-配置实例-动静分离"><a href="#6-Nginx-配置实例-动静分离" class="headerlink" title="6.Nginx 配置实例-动静分离"></a>6.Nginx 配置实例-动静分离</h3><ol>
<li><p>简述</p>
<blockquote>
<p>Nginx 动静分离简单来说就是把动态跟静态请求分开，不能理解成只是单纯的把动态页面和静态页面物理分离</p>
<p><strong>严格意义上说应该是动态请求跟静态请求分开，可以理解成使用 Nginx 处理静态页面，Tomcat 处理动态页面</strong></p>
<p>动静分离从目前实现角度来讲大致分为两种</p>
<ul>
<li>纯粹把静态文件独立成单独的域名，放在独立的服务器上，也是目前主流推崇的方案</li>
<li>是动态跟静态文件混合在一起发布，通过 nginx 来分开</li>
</ul>
<p><img src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/%E5%8A%A8%E9%9D%99%E5%88%86%E7%A6%BB%E7%A4%BA%E6%84%8F.png" alt="动静分离示意"></p>
</blockquote>
<blockquote>
<p>通过 location 指定不同的后缀名实现不同的请求转发</p>
<p>通过 expires 参数设置，可以使浏览器缓存过期时间，减少与服务器之前的请求和流量</p>
<p>具体 Expires 定义：是给一个资源设定一个过期时间，也就是说无需去服务端验证，直接通过浏览器自身确认是否过期即可， 所以不会产生额外的流量</p>
<p>此种方法非常适合不经常变动的资源（如果经常更新的文件， 不建议使用 Expires 来缓存）</p>
<p>这里设置 3d，表示在这 3 天之内访问这个 URL，发送 一个请求，比对服务器该文件最后更新时间没有变化，则不会从服务器抓取，返回状态码 304，如果有修改，则直接从服务器重新下载，返回状态码 200</p>
</blockquote>
</li>
<li><p>实例</p>
<blockquote>
<p>修改配置文件 <code>redis.conf</code></p>
<p>重点是添加 location</p>
</blockquote>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">server <span class="punctuation">&#123;</span></span><br><span class="line">    listen	<span class="number">80</span>;</span><br><span class="line">    server_name	<span class="number">192.168</span><span class="number">.10</span><span class="number">.120</span>;</span><br><span class="line">    </span><br><span class="line">    location /www/ <span class="punctuation">&#123;</span></span><br><span class="line">    	root /data/;</span><br><span class="line">    	index index.html index.htm;</span><br><span class="line">	<span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">	location /image/ <span class="punctuation">&#123;</span></span><br><span class="line">        root /data/;</span><br><span class="line">        autoindex on;</span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li>
</ol>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="https://gitee.com/zcmmmm/zcmmmm">zcm</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://gitee.com/zcmmmm/zcmmmm/2022/10/15/Nginx%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">https://gitee.com/zcmmmm/zcmmmm/2022/10/15/Nginx%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://gitee.com/zcmmmm/zcmmmm" target="_blank">无人深空</a>！</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/Nginx/">Nginx</a></div><div class="post_share"><div class="social-share" data-image="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/css/share.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/js/social-share.min.js" defer></script></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/2022/10/16/Nginx%E9%9D%A2%E7%BB%8F/"><img class="prev-cover" src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">Nginx面经</div></div></a></div><div class="next-post pull-right"><a href="/2022/10/14/Redis%E9%9D%A2%E7%BB%8F/"><img class="next-cover" src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Redis/Redis.png" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">Redis面经</div></div></a></div></nav><div class="relatedPosts"><div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span>相关推荐</span></div><div class="relatedPosts-list"><div><a href="/2022/10/16/Nginx%E9%9D%A2%E7%BB%8F/" title="Nginx面经"><img class="cover" src="https://study-record-images.oss-cn-beijing.aliyuncs.com/Java/Nginx/Nginx.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-10-16</div><div class="title">Nginx面经</div></div></a></div></div></div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span><span class="toc-percentage"></span></div><div class="toc-content is-expand"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#Nginx%E5%9F%BA%E7%A1%80%E7%AF%87"><span class="toc-text">Nginx基础篇</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-Nginx-%E7%AE%80%E4%BB%8B"><span class="toc-text">1.Nginx 简介</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2-Nginx-%E5%AE%89%E8%A3%85"><span class="toc-text">2.Nginx 安装</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3-Nginx-%E5%B8%B8%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4%E5%92%8C%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"><span class="toc-text">3.Nginx 常用的命令和配置文件</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4-Nginx-%E9%85%8D%E7%BD%AE%E5%AE%9E%E4%BE%8B-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86"><span class="toc-text">4.Nginx 配置实例-反向代理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-Nginx-%E9%85%8D%E7%BD%AE%E5%AE%9E%E4%BE%8B-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1"><span class="toc-text">5.Nginx 配置实例-负载均衡</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6-Nginx-%E9%85%8D%E7%BD%AE%E5%AE%9E%E4%BE%8B-%E5%8A%A8%E9%9D%99%E5%88%86%E7%A6%BB"><span class="toc-text">6.Nginx 配置实例-动静分离</span></a></li></ol></li></ol></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2022 - 2023 By zcm</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">搜索</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span>  数据库加载中</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div><hr/><div id="local-search-results"></div></div></div><div id="search-mask"></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.umd.min.js"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js"></script><script src="/js/search/local-search.js"></script><div class="js-pjax"></div><script src="/js/categories.js?v1"></script><script src="/js/navigation.js?v1"></script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>